iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0

在Java中,除了普通的類別(class)之外,還有枚舉(Enum)、抽象類別(Abstract Class)和介面(Interface)等不同的概念和機制,每個都有其獨特的用途和優勢,我們將討論它們的定義、用途以及何時使用它們。

抽象類(Abstract Class)

1.1 定義

抽象類別是一種不能實例化的類別,它用於定義其他類別的基本結構和行為。抽象類別通常包含一個或多個抽象方法,這些方法沒有具體的實現,只有方法的簽名。子類別必須實現(覆蓋)這些抽象方法,以具體實現其功能。

1.2 運用場景

在某些情況下,某個父類別只是知道其子類別應該包含怎樣的方法,但無法準確地知道這些子類別如何實作這些方法。例如定義了一個 Shape類別,這個類別應該提供一個運算周長的方法calPerimetero,但不同 Shape 子類别對周長的運算方法是不一樣的,即 Shape 類別無法準確地知道其子類別運算周長的方法(即形狀不同周長的計算方法不同)。

1.3規則

1.3.1.

abstract 可以用來修飾的有: 1. 類別 2. 方法

1.3.2.

抽象類別必須使用abstract修飾詞來修飾,抽象方法也,必須使用abstract修飾詞來
修飾,抽象方法不能有方法體。(可以記成不能有{})

1.3.3.

抽象類别不能被實例化,無法使用new關鍵字來呼叫抽象類別的建構子建立抽
象類別的實例。即使抽象類別裡不包含抽象方法,這個抽象類別也不能建立實
例,只能當作父類別,被其他子類別繼承,子類要完整父類。

1.3.4.

抽象類別可以包含成員變數、方法(普通方法和抽象方法都可以)、建構子、
初始化區塊、内部類别(介面、列舉)5種成分。

1.3.5.

被定義成抽象類別:任何有包括到抽象方法的情況:

  1. 直接定義了一個抽象方法;
  2. 繼承一個抽象父類别,但没有完全實作父類别包含的抽象方法;
  3. 實作了一個介面,但沒有完全實作介面包含的抽象方法三種情況

1.3.6.

不能和final同時使用

因為當使用 abstract 修飾類別時,表明這個類別只能被繼承;當使用 abstract 修飾方
法時,表明這個方法必須由子類別提供實作(即覆寫),然而final 修飾的類別不能被繼承
,final 修飾的方法也不能被覆寫

1.3.7.

不能和static 一起修飾方法

因為當使用 static 修飾一個方法時,表明這個方法屬於該類别本身,即通過類別就可呼叫該方法,但如果該方法被定義成抽象方法,則將導致通過該類別來呼叫該方法時出現錯誤(呼叫了一個沒有方法體的方法肯定會引起錯誤)。因此 static和abstract 不能同時修飾某個方法,即没有所謂的類別抽象方法。但可以同時修飾內部類別(之後會提到)

1.3.8.

private和abstract不能同時修飾方法

abstract關鍵字修飾的方法必須被其子類別覆寫才有意義,否則這個方法將永遠不會有方法體,因此abstract方法不能定義為private存取權限

下面定義一個Shape 類別

public abstract class Shape {
	private String color;
	//定義一個運算周長的抽象方法
	public abstract double calPerimeter();
	//定義一個返回形狀的抽象方法
	public abstract String getType();
	//定義Shape 建構子,建構子並不適用於建立Shape 物件而是用於被子類別呼叫
	public Shape() {}
	public Shape(String color) {
		System.out.println("執行Shape 的建構子");
		this.color = color;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
}

解釋一下上面Shape類別做了什麼事~

  1. 它包含了兩個抽象方法:calPerimeter( )和getType(),所以這個Shape 類別只能被定義成抽象類别。
  2. Shape類別裡包含了建構子,這些都不是在建立 Shape 物件時被呼叫的,而是在建立其子類別的實例時被呼叫。抽象類别不能用於建立實例,只能當作父類別被其他子類別繼承。

下面定義一個Triangle類別繼承Shape類別:

public class Triangle extends Shape{
	
	//定義三個邊
	private Double a;
	
	private Double b;
	
	private Double c;
	
	public Triangle(String color, Double a, Double b,  Double c) {
		super(color);
		this.setSides(a, b ,c);
	}
	
	public void setSides(Double a, Double b, Double c) {
		if(a >= b + c || b >= a+c || c >= a + b) {
			System.out.println("三角形兩邊之和必須大於第三邊");
			return;
		}
		this.a = a;
		this.b = b;
		this.c = c;
	}

	@Override
	public double calPerimeter() {
		return a + b + c;
	}

	@Override
	public String getType() {
		return "三角形";
	}
	
}

上面的 Triangle 類別因為繼承了 Shape 抽象類别,需要實作了 Shape 類別中兩個抽象方法,Triangle 類別是一個普通類別,因此可以建立 Triangle 頻別的實例,可以讓一個 Shape 類型的參照變數指向 Triangle 物件。

今天就先到這邊~


上一篇
Day 20 多型Polymorphism
下一篇
Day 22 其他類 II
系列文
玩轉Java:從基礎打造你的程式超能力30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言